﻿/* 
 * File:   search_ext.h
 * Author: aple
 */

#ifndef __SEARCH_EXT_H_H_
#define	__SEARCH_EXT_H_H_

#include "stdint.h"

#ifdef	__cplusplus
extern "C" {
#endif

	int16_t str_list_search_str(void **list, void *str); //从一个字符串列表中查找指定字符串位置

	/*-二分搜索*//*返回数据所在位置， 未搜索到返回-1-*/
	int binary_search_num(int(*get_attr_val)(int), int val, int Len);
	int binary_search_str_list(void * str_list, char *str, int Len);

	/*-顺序搜索*//*返回搜索到的第一个数据位置， 未搜索到返回-1-*/
	int16_t search32(void *list, int16_t len, uint32_t dat);
	int16_t search16(void *list, int16_t len, uint16_t dat);
	int16_t search8(void *list, int16_t len, uint8_t dat);

	/*-----------------------------------------------------------------------------------------------------*
	 * 二分搜索法，从siteStart到siteEnd区间
	 * mode: 输出模式。0(未命中目标时返回-1)，-1(未命中目标时返回小于目标值的位置)，1(未命中目标时返回大于目标值的位置)
	 * return 返回-1代表未搜到指定结果， +数指向搜索结果位置
	 *-----------------------------------------------------------------------------------------------------*/
	typedef struct
	{
		int32_t des_site; //搜索结果  有效结果/(-1=UINT32_MAX)
		int32_t siteStart;//开始位置
		int32_t siteEnd;  //结束位置
		int32_t element_amount;             //元素数量， 应保证Start和End小于element_amount
		void *cfg;  //当get val需要指针时，该值作为传递参数
		uint32_t(*get_val)(const void * cfg, int32_t site);   //获取元素值            
	} binary_search_list_u32_type;

	typedef struct
	{
		int32_t des_site; //搜索结果  有效结果/(-1=UINT32_MAX)
		int32_t siteStart;//开始位置
		int32_t siteEnd;  //结束位置
		int32_t element_amount;             //元素数量， 应保证Start和End小于element_amount
		void *cfg;         //当get val需要指针时，该值作为传递参数
		int32_t(*get_val)(const void * cfg, int32_t site);   //获取元素值
	} binary_search_list_i32_type;

	void binary_search_list_u32(binary_search_list_u32_type * cfg, uint32_t des_val, int8_t mode);
	void binary_search_list_i32(binary_search_list_i32_type * cfg, int32_t des_val, int8_t mode);



#ifdef	__cplusplus
}
#endif

#endif	/* __SEARCH_EXT_H_H_ */

